/**
 * @Author 12629
 * @Date 2022/3/9 17:28
 * @Description：
 */
//class MyArray1 {
//    public Object[] array = new Object[10];//0
//    /**
//     * 给pos位置 设置一个值
//     * @param pos
//     * @param val
//     */
//    public void setVal(int pos,Object val) {
//        array[pos] = val;
//    }
//    /**
//     * 获取pos下标的值
//     * @param pos
//     * @return
//     */
//    public Object getPos(int pos) {
//        return array[pos];
//    }
//}

import com.sun.org.apache.regexp.internal.RE;

import java.lang.reflect.Array;
import java.util.ArrayList;

/**
 * <T> : 只是一个占位符，代表当前类 是一个泛型类
 * 泛型的意义：
 * 1、可以自动进行类型的检查
 * 2、可以自动进行类型的转换
 *
 * 坑：
 * 1、不能new泛型类型的数组   T[] array = new T[10];
 *
 * 2、MyArray<int> myArray = new MyArray<int>(); 尖括号当中的数据  一定不能是简单类型。
 * 3、MyArray<Integer> myArray = new MyArray<>();   MyArray@4554617c
 *    MyArray<String> myArray2 = new MyArray<>();   MyArray@74a14482
 *    尖括号当中的类型  不参与组成
 *
 * 重点：
 * 1、你知道<>里面 写什么  会影响什么？
 * 2、泛型到底是怎么编译的？
 *    擦除机制：编译的时候会将T-》擦除为Object.
 *
 * @param <T>
 */
class MyArray<T> {
    public T[] array = array = (T[]) Array.newInstance(Integer.class, 10);//0

//    public MyArray(Class<T> clazz, int capacity) {
//        array = (T[])Array.newInstance(clazz, capacity);
//    }
    /**
     * 给pos位置 设置一个值
     * @param pos
     * @param val
     */
    public void setVal(int pos,T val) {
        array[pos] = val;
    }
    /**
     * 获取pos下标的值
     * @param pos
     * @return
     */
    public T getPos(int pos) {
        return array[pos];
    }

    public T[] getArray() {
        return array;
    }
}
class Person{

}
class Student extends Person {

}
public class TestDemo {


    public static void main(String[] args) {
        ArrayList<? super Integer> list = new ArrayList<Integer>();
        ArrayList<? super Integer> list2 = new ArrayList<Number>();

        list.add(1);

    }

    public static void main44(String[] args) {
        ArrayList<? super Person> list = new ArrayList<Person>();
        //ArrayList<? super Person> list2 = new ArrayList<Student>();
        //最小的粒度 Person-> 添加的是person或者person的子类
        list.add(new Student());
        list.add(new Person());//适合写入
        //Object student = list.get(0);

    }

    public static void printAll(MyArray<? extends Number> list) {

    }

    public static void main11(String[] args) {
        printAll(new MyArray<Integer>());
        printAll(new MyArray<Double>());
        printAll(new MyArray<Number>());
    }


    public static void main5(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setVal(0,19);
        myArray.setVal(1,"hello");
        String s = (String)myArray.getPos(1);
        System.out.println(s);
        /*Integer[] ret = {1,2,3,4};
        Object[] objets = ret ;*/

        Object[] ret = {1,2,3,4,"gaobo"};
        Integer[] objets = (Integer[])ret ;

    }

    public static void main4(String[] args) {
        //编译的时候，但是数组是在运行的时候 获取真正的类型的
        MyArray<Integer> myArray = new MyArray<>();
        Integer[] ret = myArray.getArray();
        //Integer[] ret = Objet[];error

    }

    public static void main3(String[] args) {
        Person person = new Person();
        System.out.println(person);

        MyArray<Integer> myArray = new MyArray<>();
        System.out.println(myArray);

        MyArray<String> myArray2 = new MyArray<>();
        System.out.println(myArray2);

    }


    public static void main2(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.setVal(0,10);
        //myArray.setVal(1,"hello");
        myArray.setVal(1,9);

        int ret = myArray.getPos(1);
        System.out.println(ret);

        MyArray<String> myArray2 = new MyArray<>();
        myArray2.setVal(0,"hello");

    }

    public static void main1(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setVal(0,19);
        myArray.setVal(1,"hello");
        String s = (String)myArray.getPos(1);
        System.out.println(s);
    }
}
